package javase.chixing.thread_synchronized;

/**
 * 本 demo 用于学习线程内容
 */
class ThreadMainDemo {
    public static Object obj = new Object();
    //主函数也是线程之一，java线程优先级默认为5
    public static void main(String[] args) {
        //创建线程方式2>>>通过实现接口创建线程对象(常用)
        Thread threadB = new Thread(new ThreadB());
        //创建线程方式1>>>通过接口创建线程对象
        Thread threadA = new Thread(new ThreadA(threadB));

        Thread threadC = new Thread(new ThreadC());
        Thread threadD = new Thread(new ThreadD());
        //注意：多线程同时执行会出现同时执行的情况(通过join解决)
        //解决方法：举例：B线程执行完之后再执行A线程
        //在A线程的方法体中引用B.join()，会执行B线程，此时A进入阻塞状态
        //当B线程执行完毕，A线程的阻塞状态结束，继续执行A线程

        //练习：1000个线程同时对银行存钱，每人10块钱，求存完之后的余额
        BankObject bankObject = new BankObject();
        for (int i = 0; i < 1000; i++) {
            Thread bankThread = new Thread(new BankThread(bankObject));
            //注意：多线程同时执行，可能会出现两个线程同时拿到相同的数据进行处理,不能得到有效数据
            //解决方案，给对应的方法加上锁
            //>>>上锁1：方法体直接加synchronized
            //>>>上锁2:方法体内用构造快synchronized(this){}
            //>>>上锁3:对应对象当中创建锁对象 -> public final Lock lock = new ReentrantLock();
            //                          --> 在方法体内上锁 lock.lock(); -->解锁 lock.unlock();
//            bankThread.start();
        }


        //以下均为测试代码
        threadA.start();
        threadB.start();

        //(wait notify测试代码)
        threadC.start();
        threadD.start();
    }
}
